/**
 * @file ConsultarPruebasPaciente.java
 * @brief Interfaz que muestra todas las pruebas de un determinado paciente en un periodo determinado
 *
 * Copyright (C)  - May [2011]
 *
 * @author Carlos Castilla Ruiz
 * @version 01.00
 *
 */

package interfaces;

import interfaces.farmacia.*;


import Controlador.*;
import GestorCitas.*;
import GestorPruebas.*;
import GestorUsuarios.Paciente;
import GestorUsuarios.Usuario;
import GestorUsuarios.*;
import clinica.ClinicaView;
import clinica.Interfaces;
import clinica.Interfaz;
import java.awt.event.*;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import org.jdesktop.application.Action;
import java.util.Date;

/**
 *
 * @author Carlos Castilla Ruiz
 */
public class ConsultarPruebasPaciente extends javax.swing.JPanel{

    private TableModel _modelo;
    private ClinicaView _app;
    private Prueba[]  _prueba ;
    Interfaces _anterior,_actual;

    public ConsultarPruebasPaciente(ClinicaView a) {
        _app = a;
        initComponents();
    }

   
    public void rellenaDatos(Integer id_paciente,Date fecha1,Date fecha2,TipoPrueba tipo,Interfaces ant,Interfaces act) throws GestorUsuarios.IDException, SQLException, IOException, ClassNotFoundException, SQLException, NoSuchAlgorithmException, ParseException {
        DateFormat fecha_formato = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        _anterior = ant;
        _actual= act;

         TipoUsuario t=Controlador.getUsuarioActivo().getTipo();
         if(Controlador.getUsuarioActivo().getTipo()==t.GESTOR){
            estado_label.setVisible(true);
            estado.setVisible(true);
            asignar_resultados.setVisible(false);
        }else{
            asignar_resultados.setVisible(true);
            estado_label.setVisible(false);
            estado.setVisible(false);
        }

        // Limpiamos la tabla de pruebas
        Interfaz.limpiarTabla(panel_pruebas_paciente);
        
        Prueba e=new Prueba();
        EstadoPrueba ti=e.getEstadoPrueba();
        // Obtenemos todas las pruebas (historial) para el paciente en cuestion
        _prueba = Controlador.consultarPruebas(null,id_paciente,null,null,null,tipo,ti.Pendiente);

        if(_prueba == null) {
            _app.abrirMensajeError("No se encontró ninguna prueba para dicho paciente.", _anterior);
            return;
        }

        int cont=0;
        for(int j=0;j<_prueba.length;j++){
            if(fecha1!=null){
                if((_prueba[j].getFecha().getTime()<fecha1.getTime())){
                    cont++;
                }
            }
            if(fecha2!=null){
                if((_prueba[j].getFecha().getTime()>fecha1.getTime())){
                    cont++;
                }
            }
        }
        
        if(_prueba.length==cont) {
            _app.abrirMensajeError("No se encontró ninguna prueba durante esas fechas para dicho paciente.", _anterior);
            return;
        }

        // Rellenamos la tabla
        Object[][] data =  new Object[_prueba.length][];
        int i=0;
        int a=0;
        while(i<_prueba.length) {
            if(fecha1!=null && fecha2!=null){
                if((_prueba[i].getFecha().getTime()>fecha1.getTime()) && (_prueba[i].getFecha().getTime()<fecha2.getTime())){
                   Paciente p = (Paciente) Paciente.get(_prueba[i].getIdPaciente());
                   data[a] = new Object[4];
                   data[a][0] = fecha_formato.format(_prueba[i].getFecha());
                   data[a][1] = p.getNombre()+" "+p.getApellidos();
                   data[a][2] = _prueba[i].getTipo();
                   data[a][3] = _prueba[i].getEstadoPrueba();
                   a++;
                }
            }else{
                if(fecha1!=null){
                    if((_prueba[i].getFecha().getTime()>fecha1.getTime())){
                       Paciente p = (Paciente) Paciente.get(_prueba[i].getIdPaciente());
                       data[a] = new Object[4];
                       data[a][0] = fecha_formato.format(_prueba[i].getFecha());
                       data[a][1] = p.getNombre()+" "+p.getApellidos();
                       data[a][2] = _prueba[i].getTipo();
                       data[a][3] = _prueba[i].getEstadoPrueba();
                       a++;
                    }
                }else{
                    if(fecha2!=null){
                        if((_prueba[i].getFecha().getTime()<fecha2.getTime())){
                           Paciente p = (Paciente) Paciente.get(_prueba[i].getIdPaciente());
                           data[a] = new Object[4];
                           data[a][0] = fecha_formato.format(_prueba[i].getFecha());
                           data[a][1] = p.getNombre()+" "+p.getApellidos();
                           data[a][2] = _prueba[i].getTipo();
                           data[a][3] = _prueba[i].getEstadoPrueba();
                           a++;
                        }
                    }else{
                           Paciente p = (Paciente) Paciente.get(_prueba[i].getIdPaciente());
                           data[a] = new Object[4];
                           data[a][0] = fecha_formato.format(_prueba[i].getFecha());
                           data[a][1] = p.getNombre()+" "+p.getApellidos();
                           data[a][2] = _prueba[i].getTipo();
                           data[a][3] = _prueba[i].getEstadoPrueba();
                           a++;
                    }
                }
            }
            i++;
        }

        String[] columnNames = {"Hora de la prueba","Nombre del paciente","Tipo de prueba","Estado de la prueba"};
        _modelo = new DefaultTableModel(data, columnNames);
        panel_pruebas_paciente.setModel(_modelo);
        panel_pruebas_paciente.setRowHeight(32);
       

       


    }


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        panel_pruebas_paciente = new javax.swing.JTable();
        jButton2 = new javax.swing.JButton();
        asignar_resultados = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        estado = new javax.swing.JComboBox();
        estado_label = new javax.swing.JLabel();

        setMaximumSize(new java.awt.Dimension(780, 470));
        setMinimumSize(new java.awt.Dimension(780, 470));

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Pruebas", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, Interfaz.setFontSize()));
        jPanel1.setMaximumSize(new java.awt.Dimension(780, 470));
        jPanel1.setName("jPanel1"); // NOI18N

        jScrollPane1.setFont(Interfaz.setFontSize());
        jScrollPane1.setName("jScrollPane1"); // NOI18N

        panel_pruebas_paciente.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Hora de la prueba", "Nombre del paciente", "Tipo de prueba", "Estado de la prueba"
            }
        ));
        panel_pruebas_paciente.setName("panel_pruebas_paciente"); // NOI18N
        jScrollPane1.setViewportView(panel_pruebas_paciente);
        panel_pruebas_paciente.getAccessibleContext().setAccessibleName("panel_pruebas_paciente");

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 960, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 318, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance().getContext().getActionMap(ConsultarPruebasPaciente.class, this);
        jButton2.setAction(actionMap.get("aceptar")); // NOI18N
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance().getContext().getResourceMap(ConsultarPruebasPaciente.class);
        jButton2.setIcon(resourceMap.getIcon("jButton2.icon")); // NOI18N
        jButton2.setLabel(resourceMap.getString("jButton3.label")); // NOI18N
        jButton2.setName("jButton2"); // NOI18N

        asignar_resultados.setAction(actionMap.get("asignarResultado")); // NOI18N
        asignar_resultados.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        asignar_resultados.setIcon(resourceMap.getIcon("jButton3.icon")); // NOI18N
        asignar_resultados.setText(resourceMap.getString("jButton3.text")); // NOI18N
        asignar_resultados.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        asignar_resultados.setName("asignar_resultados"); // NOI18N

        jButton4.setAction(actionMap.get("cancelar")); // NOI18N
        jButton4.setIcon(resourceMap.getIcon("jButton4.icon")); // NOI18N
        jButton4.setName("jButton4"); // NOI18N

        estado.setFont(Interfaz.setFontSize());
        estado.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Pendiente", "Cancelada" }));
        estado.setName("estado"); // NOI18N
        estado.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                estadoActionPerformed(evt);
            }
        });

        estado_label.setFont(Interfaz.setBoldFontSize());
        estado_label.setText("Cambiar estado de la prueba");
        estado_label.setName("estado_label"); // NOI18N

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                        .add(29, 29, 29)
                        .add(asignar_resultados)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 222, Short.MAX_VALUE)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(estado_label)
                            .add(estado, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 153, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(192, 192, 192)
                        .add(jButton4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 84, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(27, 27, 27)
                        .add(jButton2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 84, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                        .addContainerGap()
                        .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .add(20, 20, 20)
                .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(18, 18, 18)
                        .add(estado_label)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(estado, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 37, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(layout.createSequentialGroup()
                        .add(7, 7, 7)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(jButton2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 76, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jButton4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 76, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(org.jdesktop.layout.GroupLayout.TRAILING, asignar_resultados, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 77, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))
                .add(19, 19, 19))
        );

        getAccessibleContext().setAccessibleName("Asignar resultado");
    }// </editor-fold>//GEN-END:initComponents

    private void estadoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_estadoActionPerformed
        int fila = panel_pruebas_paciente.getSelectedRow();
        String exito=null;

        if(fila >= 0){
            Prueba pr=_prueba[fila];
            EstadoPrueba e=pr.getEstadoPrueba();

            int s = estado.getSelectedIndex();
            try{
                if(s==1 && e!=e.Cancelada){//2==No realizada
                    //pr.setEstadoPrueba(e.No_realizada);
                    //asignaEstado(pr);
                    exito=Controlador.cambiarEstadoPrueba(pr.getIdPrueba(),e.Cancelada);
                }
            } catch(java.security.NoSuchAlgorithmException nsae){
            } catch(GestorUsuarios.IDException ide){
            } catch(java.lang.ClassNotFoundException cnfe){
            } catch(java.io.IOException ioe){
            } catch(java.text.ParseException pe){
            }

            if(exito==null) {
                _app.abrirMensajeExito("El estado ha sido modificado correctamente", _anterior);
            } else {
                _app.abrirMensajeError(exito,_anterior);
            }
        }else{
            _app.limpiaErrores();
            _app.addError("No ha seleccionado ninguna prueba");
            _app.muestraListaErrores();
        }
}//GEN-LAST:event_estadoActionPerformed
    

    @Action
    public void aceptar() throws NoSuchAlgorithmException, IOException, ClassNotFoundException, SQLException {
        _app.volver(_anterior);
    }

    @Action
    public void asignarResultado()throws NoSuchAlgorithmException, IOException, ClassNotFoundException, SQLException {
        int fila = panel_pruebas_paciente.getSelectedRow();
        EstadoPrueba e;

        if(fila >= 0){
            Prueba pr=_prueba[fila];
            e=pr.getEstadoPrueba();
            if(pr.getEstadoPrueba()!=e.Realizada){
                switch (pr.getTipo()) {
                    case HematologiaGeneral:
                         _app.abrirAsignarResultadoPruebaHematologia(pr,_actual);
                        break;
                    case BioquimicaGeneral:
                        _app.abrirAsignarResultadoPruebaBioquimicaGeneral(pr,_actual);
                        break;
                    case MarcadoresTumorales:
                        _app.abrirAsignarResultadoPruebaMarcadoresTumorales(pr, _actual);
                        break;
                    case Hormonas:
                        _app.abrirAsignarResultadoPruebaHormonas(pr, _actual);
                        break;
                    case Urianalisis:
                        _app.abrirAsignarResultadoPruebaUrianalisis(pr,_actual);
                        break;
                    case Hemostasia:
                        _app.abrirAsignarResultadoPruebaHemostasia(pr,_actual);
                        break;
                    case Radiografia:
                        _app.abrirAsignarResultadoPruebaRadiografia(pr,_actual);
                        break;
                    default:
                        break;
                }
            }else{
                _app.limpiaErrores();
                _app.addError("No puede asignar valores a una prueba ya realizada");
                _app.muestraListaErrores();
            }
        }
    }

    @Action
    public void cancelar() throws NoSuchAlgorithmException, IOException, ClassNotFoundException, SQLException{
        _app.volver(_anterior);
    }


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton asignar_resultados;
    private javax.swing.JComboBox estado;
    private javax.swing.JLabel estado_label;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable panel_pruebas_paciente;
    // End of variables declaration//GEN-END:variables


}
